use more XP style functions
authorcinamod <cinamod>
Tue, 21 Oct 2003 18:51:29 +0000 (18:51 +0000)
committercinamod <cinamod>
Tue, 21 Oct 2003 18:51:29 +0000 (18:51 +0000)
modules/engines/ms-windows/ChangeLog.old
modules/engines/ms-windows/wimp_style.c
modules/engines/ms-windows/xp_theme.c
modules/engines/ms-windows/xp_theme.h

index 75fe2a0d6743bf4b6b716d60a4a30cf957847f5b..003b9e851cf442e8e09a900fadd5fe6f74d24c61 100755 (executable)
@@ -1,3 +1,13 @@
+2003-10-21  Dom Lachowicz <cinamod@hotmail.com>\r
+\r
+       * src/wimp_style.c: Use theme colors\r
+       Use theme metrics\r
+       (disabled) Use theme fonts\r
+       Theme menu items, menu separators\r
+       Draw status bar resize grips\r
+\r
+       * src/xp_theme.c: Ditto\r
+       \r
 2003-10-20  Raymond Penners  <raymond@dotsphinx.com>\r
 \r
        * src/wimp_style.c: Added grippers to XP scrollbars. \r
index b78afa7b7ca8b8bbbcd8fb63e709695a508676d1..95a9e2b62ef0c63f52c24e3095320193951fabc5 100755 (executable)
@@ -116,40 +116,39 @@ static struct {
   { radio_text_bits, NULL }
 };
 
-typedef enum
-{
-       CAPTION_FONT,
-       MENU_FONT,
-       STATUS_FONT,
-       MESSAGE_FONT
-} SystemFontType;
-
 static gboolean
-get_system_font(SystemFontType type, LOGFONT *out_lf)
+get_system_font(XpThemeClass klazz, XpThemeFont type, LOGFONT *out_lf)
 {
-  NONCLIENTMETRICS ncm;
-  ncm.cbSize = sizeof(NONCLIENTMETRICS);
-
-  if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
-                          sizeof(NONCLIENTMETRICS), &ncm, 0))
-    {
-      if (type == CAPTION_FONT)
-       *out_lf = ncm.lfCaptionFont;
-      else if (type == MENU_FONT)
-       *out_lf = ncm.lfMenuFont;
-      else if (type == STATUS_FONT)
-       *out_lf = ncm.lfStatusFont;
-      else
-       *out_lf = ncm.lfMessageFont;
-
-      return TRUE;
-    }
-
+#if 0
+  /* TODO: this crashes. need to figure out why and how to fix it */
+  if (xp_theme_get_system_font(klazz, type, out_lf)) {
+         return TRUE;
+  } else
+#endif
+  {
+         NONCLIENTMETRICS ncm;
+         ncm.cbSize = sizeof(NONCLIENTMETRICS);
+
+         if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
+                                  sizeof(NONCLIENTMETRICS), &ncm, 0))
+           {
+             if (type == XP_THEME_FONT_CAPTION)
+               *out_lf = ncm.lfCaptionFont;
+             else if (type == XP_THEME_FONT_MENU)
+               *out_lf = ncm.lfMenuFont;
+             else if (type == XP_THEME_FONT_STATUS)
+               *out_lf = ncm.lfStatusFont;
+             else
+               *out_lf = ncm.lfMessageFont;
+
+             return TRUE;
+           }
+  }
   return FALSE;
 }
 
 static char *
-sys_font_to_pango_font (SystemFontType type, char * buf)
+sys_font_to_pango_font (XpThemeClass klazz, XpThemeFont type, char * buf)
 {
   HDC hDC;
   HWND hwnd;
@@ -158,7 +157,7 @@ sys_font_to_pango_font (SystemFontType type, char * buf)
   const char * weight;
   const char * style;
 
-  if (get_system_font(type, &lf))
+  if (get_system_font(klazz, type, &lf))
     {
       switch (lf.lfWeight) {
       case FW_THIN:
@@ -218,33 +217,35 @@ sys_font_to_pango_font (SystemFontType type, char * buf)
 #define SPI_GETMENUSHOWDELAY 106
 #endif
 
+#define XP_THEME_CLASS_UNKNOWN XP_THEME_CLASS_BUTTON
+
 static void
 setup_menu_settings (void)
 {
   int menu_delay;
   gboolean win95 = FALSE;
-  
+
   GtkSettings * settings;
   OSVERSIONINFOEX osvi;
-  
+
   settings = gtk_settings_get_default ();
   if (!settings)
     return;
-  
+
   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-  
+
   if (!GetVersionEx ( (OSVERSIONINFO *) &osvi))
     win95 = TRUE; /* assume the worst */
-  
+
   if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
     if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
       win95 = TRUE;
-  
+
   if (!win95) {
     if (SystemParametersInfo (SPI_GETMENUSHOWDELAY, 0, &menu_delay, 0)) {
       GObjectClass * klazz = G_OBJECT_GET_CLASS(G_OBJECT(settings));
-      
+
       if (klazz) {
        if (g_object_class_find_property (klazz, "gtk-menu-bar-popup-delay")) {
          g_object_set (G_OBJECT (settings), "gtk-menu-bar-popup-delay",
@@ -286,8 +287,7 @@ wimp_style_setup_system_settings (void)
   g_object_set (G_OBJECT (settings), "gtk-double-click-time",
                GetDoubleClickTime(), NULL);
   g_object_set (G_OBJECT (settings), "gtk-dnd-drag-threshold",
-               GetSystemMetrics (SM_CXDRAG), NULL);
-
+               GetSystemMetrics(SM_CXDRAG), NULL);
 
   setup_menu_settings ();
 
@@ -298,7 +298,6 @@ wimp_style_setup_system_settings (void)
 
   g_object_set (G_OBJECT (settings), "gtk-icon-sizes",
                "gtk-menu=10,10 : gtk-button=16,16 : gtk-small-toolbar=16,16 : gtk-large-toolbar=16,16 : gtk-dialog=32,32 : gtk-dnd=32,32", NULL);
-
 #endif
 
   /*
@@ -313,20 +312,35 @@ setup_system_font(GtkStyle *style)
 {
   char buf[256], * font; /* It's okay, lfFaceName is smaller than 32 chars */
 
-  if ((font = sys_font_to_pango_font(MESSAGE_FONT, buf)) != NULL)
+  if ((font = sys_font_to_pango_font(XP_THEME_CLASS_UNKNOWN, XP_THEME_FONT_MESSAGE, buf)) != NULL)
     style->font_desc = pango_font_description_from_string(font);
 }
 
 static void
-sys_color_to_gtk_color(int id, GdkColor *pcolor)
+sys_color_to_gtk_color(XpThemeClass klazz, int id, GdkColor *pcolor)
 {
-  DWORD color   = GetSysColor(id);
+  DWORD color;
+
+  if (!xp_theme_get_system_color (klazz, id, &color))
+       color = GetSysColor(id);
+
   pcolor->pixel = color;
   pcolor->red   = (GetRValue(color) << 8) | GetRValue(color);
   pcolor->green = (GetGValue(color) << 8) | GetGValue(color);
   pcolor->blue  = (GetBValue(color) << 8) | GetBValue(color);
 }
 
+static int
+get_system_metric(XpThemeClass klazz, int id)
+{
+       int rval;
+
+       if (!xp_theme_get_system_metric(klazz, id, &rval))
+               rval = GetSystemMetrics (id);
+
+       return rval;
+}
+
 static void
 setup_wimp_rc_style(void)
 {
@@ -351,26 +365,26 @@ setup_wimp_rc_style(void)
   gint paned_size = 15;
 
   /* Prelight */
-  sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &fg_prelight);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &bg_prelight);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &base_prelight);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &text_prelight);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHTTEXT, &fg_prelight);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHT, &bg_prelight);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHT, &base_prelight);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHTTEXT, &text_prelight);
 
-  sys_color_to_gtk_color(COLOR_MENUTEXT, &menu_text_color);
-  sys_color_to_gtk_color(COLOR_MENU, &menu_color);
+  sys_color_to_gtk_color(XP_THEME_CLASS_MENU, COLOR_MENUTEXT, &menu_text_color);
+  sys_color_to_gtk_color(XP_THEME_CLASS_MENU, COLOR_MENU, &menu_color);
 
   /* tooltips */
-  sys_color_to_gtk_color(COLOR_INFOTEXT, &tooltip_fore);
-  sys_color_to_gtk_color(COLOR_INFOBK, &tooltip_back);
+  sys_color_to_gtk_color(XP_THEME_CLASS_TOOLTIP, COLOR_INFOTEXT, &tooltip_fore);
+  sys_color_to_gtk_color(XP_THEME_CLASS_TOOLTIP, COLOR_INFOBK, &tooltip_back);
 
   /* text on push buttons. TODO: button shadows, backgrounds, and highlights */
-  sys_color_to_gtk_color(COLOR_BTNTEXT, &btn_fore);
+  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT, &btn_fore);
 
   /* progress bar background color */
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &progress_back);
+  sys_color_to_gtk_color(XP_THEME_CLASS_PROGRESS, COLOR_HIGHLIGHT, &progress_back);
 
   /* Enable coloring for menus. */
-  font_ptr = sys_font_to_pango_font (MENU_FONT,font_buf);
+  font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_MENU, XP_THEME_FONT_MENU,font_buf);
   sprintf(buf, "style \"wimp-menu\" = \"wimp-default\"\n"
           "{fg[PRELIGHT] = { %d, %d, %d }\n"
           "bg[PRELIGHT] = { %d, %d, %d }\n"
@@ -403,7 +417,7 @@ setup_wimp_rc_style(void)
   gtk_rc_parse_string(buf);
 
   /* enable tooltip fonts */
-  font_ptr = sys_font_to_pango_font (STATUS_FONT,font_buf);
+  font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS,font_buf);
   sprintf(buf, "style \"wimp-tooltips-caption\" = \"wimp-default\"\n"
          "{fg[NORMAL] = { %d, %d, %d }\n"
          "%s = \"%s\"\n"
@@ -424,7 +438,7 @@ setup_wimp_rc_style(void)
   gtk_rc_parse_string(buf);
 
   /* enable font theming for status bars */
-  font_ptr = sys_font_to_pango_font (STATUS_FONT,font_buf);
+  font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS,font_buf);
   sprintf(buf, "style \"wimp-statusbar\" = \"wimp-default\"\n"
          "{%s = \"%s\"\n"
          "}widget_class \"*GtkStatusbar*\" style \"wimp-statusbar\"\n",
@@ -463,7 +477,7 @@ setup_wimp_rc_style(void)
          "GtkRange::trough_border = 0\n"
          "}widget_class \"*GtkVScrollbar*\" style \"wimp-vscrollbar\"\n",
          GetSystemMetrics(SM_CYVTHUMB),
-         GetSystemMetrics(SM_CXVSCROLL));
+         get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL));
   gtk_rc_parse_string(buf);
 
   sprintf(buf, "style \"wimp-hscrollbar\" = \"wimp-default\"\n"
@@ -473,7 +487,7 @@ setup_wimp_rc_style(void)
          "GtkRange::trough_border = 0\n"
          "}widget_class \"*GtkHScrollbar*\" style \"wimp-hscrollbar\"\n",
          GetSystemMetrics(SM_CXHTHUMB),
-         GetSystemMetrics(SM_CYHSCROLL));
+         get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL));
   gtk_rc_parse_string(buf);
 
   /* radio/check button sizes */
@@ -498,37 +512,37 @@ setup_system_styles(GtkStyle *style)
   int i;
 
   /* Default forgeground */
-  sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->fg[GTK_STATE_NORMAL]);
-  sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->fg[GTK_STATE_ACTIVE]);
-  sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->fg[GTK_STATE_PRELIGHT]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &style->fg[GTK_STATE_SELECTED]);
-  sys_color_to_gtk_color(COLOR_GRAYTEXT, &style->fg[GTK_STATE_INSENSITIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT, &style->fg[GTK_STATE_NORMAL]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT, &style->fg[GTK_STATE_ACTIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT, &style->fg[GTK_STATE_PRELIGHT]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHTTEXT, &style->fg[GTK_STATE_SELECTED]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_GRAYTEXT, &style->fg[GTK_STATE_INSENSITIVE]);
 
   /* Default background */
-  sys_color_to_gtk_color(COLOR_3DFACE, &style->bg[GTK_STATE_NORMAL]);
-  sys_color_to_gtk_color(COLOR_SCROLLBAR, &style->bg[GTK_STATE_ACTIVE]);
-  sys_color_to_gtk_color(COLOR_3DFACE, &style->bg[GTK_STATE_PRELIGHT]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &style->bg[GTK_STATE_SELECTED]);
-  sys_color_to_gtk_color(COLOR_3DFACE, &style->bg[GTK_STATE_INSENSITIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DFACE, &style->bg[GTK_STATE_NORMAL]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_SCROLLBAR, COLOR_SCROLLBAR, &style->bg[GTK_STATE_ACTIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DFACE, &style->bg[GTK_STATE_PRELIGHT]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHT, &style->bg[GTK_STATE_SELECTED]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DFACE, &style->bg[GTK_STATE_INSENSITIVE]);
 
   /* Default base */
-  sys_color_to_gtk_color(COLOR_WINDOW, &style->base[GTK_STATE_NORMAL]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &style->base[GTK_STATE_ACTIVE]);
-  sys_color_to_gtk_color(COLOR_WINDOW, &style->base[GTK_STATE_PRELIGHT]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &style->base[GTK_STATE_SELECTED]);
-  sys_color_to_gtk_color(COLOR_3DFACE, &style->base[GTK_STATE_INSENSITIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOW, &style->base[GTK_STATE_NORMAL]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHT, &style->base[GTK_STATE_ACTIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOW, &style->base[GTK_STATE_PRELIGHT]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHT, &style->base[GTK_STATE_SELECTED]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DFACE, &style->base[GTK_STATE_INSENSITIVE]);
 
   /* Default text */
-  sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->text[GTK_STATE_NORMAL]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_ACTIVE]);
-  sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->text[GTK_STATE_PRELIGHT]);
-  sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_SELECTED]);
-  sys_color_to_gtk_color(COLOR_GRAYTEXT, &style->text[GTK_STATE_INSENSITIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT, &style->text[GTK_STATE_NORMAL]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_ACTIVE]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT, &style->text[GTK_STATE_PRELIGHT]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_SELECTED]);
+  sys_color_to_gtk_color(XP_THEME_CLASS_UNKNOWN, COLOR_GRAYTEXT, &style->text[GTK_STATE_INSENSITIVE]);
 
   for (i = 0; i < 5; i++)
     {
-      sys_color_to_gtk_color(COLOR_3DSHADOW, &style->dark[i]);
-      sys_color_to_gtk_color(COLOR_3DHILIGHT, &style->light[i]);
+      sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DSHADOW, &style->dark[i]);
+      sys_color_to_gtk_color(XP_THEME_CLASS_BUTTON, COLOR_3DHILIGHT, &style->light[i]);
 
       style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
       style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;
@@ -1097,10 +1111,6 @@ draw_box (GtkStyle      *style,
          gint           width,
          gint           height)
 {
-  const gchar * name;
-
-  name = gtk_widget_get_name (widget);
-
   if (detail &&
       (!strcmp (detail, "button") ||
        !strcmp (detail, "buttondefault")))
@@ -1180,17 +1190,14 @@ draw_box (GtkStyle      *style,
                return;
          }
   }
-  else if (name && !strcmp (name, "gtk-tooltips")) {
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width, height, state_type, area))
+  else if (detail && strcmp (detail, "menuitem") == 0) {
+    shadow_type = GTK_SHADOW_NONE;
+      if (xp_theme_draw (window, XP_THEME_ELEMENT_MENUITEM, style, x, y, width, height, state_type, area))
         {
                return;
         }
   }
-
-  if (detail && strcmp (detail, "menuitem") == 0)
-    shadow_type = GTK_SHADOW_NONE;
-
-  if (detail && !strcmp (detail, "trough"))
+  else if (detail && !strcmp (detail, "trough"))
     {
       if (widget && GTK_IS_PROGRESS_BAR (widget))
         {
@@ -1262,6 +1269,17 @@ draw_box (GtkStyle      *style,
           return;
         }
     }
+  else
+  {
+        const gchar * name = gtk_widget_get_name (widget);
+
+         if (name && !strcmp (name, "gtk-tooltips")) {
+        if (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width, height, state_type, area))
+          {
+                       return;
+           }
+               }
+  }
 
   parent_class->draw_box (style, window, state_type, shadow_type, area,
                          widget, detail, x, y, width, height);
@@ -1463,6 +1481,13 @@ draw_hline (GtkStyle             *style,
            gint                 x2,
            gint                 y)
 {
+
+  if (detail && !strcmp(detail, "menuitem")) {
+         if (xp_theme_draw(window, XP_THEME_ELEMENT_MENU_SEPARATOR, style,
+                       x1, y, x2, style->ythickness, state_type, area)) {
+                       return;
+         }
+  }
 #if UXTHEME_HAS_LINES
   if (xp_theme_draw(window, XP_THEME_ELEMENT_HLINE, style, x1, y, x2,
                    style->ythickness, state_type, area))
@@ -1500,6 +1525,29 @@ draw_vline (GtkStyle             *style,
     }
 }
 
+static void
+draw_resize_grip (GtkStyle      *style,
+                       GdkWindow     *window,
+                       GtkStateType   state_type,
+                       GdkRectangle  *area,
+                       GtkWidget     *widget,
+                       const gchar   *detail,
+                       GdkWindowEdge  edge,
+                       gint           x,
+                       gint           y,
+                       gint           width,
+                       gint           height)
+{
+       if (detail && !strcmp(detail, "statusbar")) {
+               if (!xp_theme_draw(window, XP_THEME_ELEMENT_STATUS_GRIPPER, style, x, y, width, height,
+                           state_type, area))
+                       return;
+       }
+
+       parent_class->draw_resize_grip (style, window, state_type, area,
+                                                                       widget, detail, edge, x, y, width, height);
+}
+
 static void
 draw_handle (GtkStyle        *style,
             GdkWindow       *window,
@@ -1519,7 +1567,7 @@ draw_handle (GtkStyle        *style,
       XpThemeElement hndl;
 
       sanitize_size (window, &width, &height);
-  
+
       if (orientation == GTK_ORIENTATION_VERTICAL)
         hndl = XP_THEME_ELEMENT_GRIPPER_V;
       else
@@ -1573,6 +1621,7 @@ wimp_style_class_init (WimpStyleClass *klass)
   style_class->draw_hline = draw_hline;
   style_class->draw_vline = draw_vline;
   style_class->draw_handle = draw_handle;
+  style_class->draw_resize_grip = draw_resize_grip;
 }
 
 GType wimp_type_style = 0;
index 6e2acffdad9fe517e977d5c20b7a28df7956fe2f..1fb1116d168285d640e00a9a1da95a5ad068c304 100755 (executable)
 
 static const LPCWSTR class_descriptors[] =
 {
-  L"Scrollbar",
-  L"Button",
-  L"Header",
-  L"ComboBox",
-  L"Tab",
-  L"Edit",
-  L"TreeView",
-  L"Spin",
-  L"Progress",
-  L"Tooltip",
-  L"Rebar",
-  L"Toolbar",
-  L"Globals"
+  L"Scrollbar", /* XP_THEME_CLASS_SCROLLBAR */
+  L"Button",    /* XP_THEME_CLASS_BUTTON */
+  L"Header",    /* XP_THEME_CLASS_HEADER */
+  L"ComboBox",  /* XP_THEME_CLASS_COMBOBOX */
+  L"Tab",       /* XP_THEME_CLASS_TAB */
+  L"Edit",      /* XP_THEME_CLASS_EDIT */
+  L"TreeView",  /* XP_THEME_CLASS_TREEVIEW */
+  L"Spin",      /* XP_THEME_CLASS_SPIN */
+  L"Progress",  /* XP_THEME_CLASS_PROGRESS */
+  L"Tooltip",   /* XP_THEME_CLASS_TOOLTIP */
+  L"Rebar",     /* XP_THEME_CLASS_REBAR */
+  L"Toolbar",   /* XP_THEME_CLASS_TOOLBAR */
+  L"Globals",   /* XP_THEME_CLASS_GLOBALS */
+  L"Menu",      /* XP_THEME_CLASS_MENU */
+  L"Window",    /* XP_THEME_CLASS_WINDOW */
+  L"Status"     /* XP_THEME_CLASS_STATUS */
 };
 
 static const short element_part_map[]=
@@ -89,7 +92,11 @@ static const short element_part_map[]=
   RP_GRIPPER,
   RP_GRIPPERVERT,
   RP_CHEVRON,
-  TP_BUTTON
+  TP_BUTTON,
+  MP_MENUITEM,
+  MP_SEPARATOR,
+  SP_GRIPPER,
+  SP_PANE
 
 #if UXTHEME_HAS_LINES
   ,
@@ -102,7 +109,10 @@ static HINSTANCE uxtheme_dll = NULL;
 static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
 
 typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
-     (HTHEME hTheme, int iFontID, FAR LOGFONT *plf);
+     (HTHEME hTheme, int iFontID, OUT LOGFONT *plf);
+typedef int (FAR PASCAL *GetThemeSysSizeFunc)
+       (HTHEME hTheme, int iSizeId);
+typedef COLORREF (FAR PASCAL *GetThemeSysColorFunc)(HTHEME hTheme, int iColorID);
 typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
      (HWND hwnd, LPCWSTR pszClassList);
 typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
@@ -113,6 +123,8 @@ typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFl
 typedef BOOL (FAR PASCAL *IsThemeActiveFunc)(VOID);
 
 static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
+static GetThemeSysColorFunc get_theme_sys_color_func = NULL;
+static GetThemeSysSizeFunc get_theme_sys_metric_func = NULL;
 static OpenThemeDataFunc open_theme_data_func = NULL;
 static CloseThemeDataFunc close_theme_data_func = NULL;
 static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
@@ -125,7 +137,7 @@ static void
 xp_theme_close_open_handles (void)
 {
   int i;
-  
+
   for (i=0; i < XP_THEME_CLASS__SIZEOF; i++)
     {
       if (open_themes[i])
@@ -142,15 +154,22 @@ xp_theme_init (void)
   if (uxtheme_dll)
     return;
 
-  uxtheme_dll = LoadLibrary("uxtheme.dll");
   memset(open_themes, 0, sizeof(open_themes));
 
+  uxtheme_dll = LoadLibrary("uxtheme.dll");
+  if (!uxtheme_dll) {
+         was_theming_active = FALSE;
+         return;
+  }
+
   is_theme_active_func = (IsThemeActiveFunc) GetProcAddress(uxtheme_dll, "IsThemeActive");
   open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");
   close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");
   draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
   enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
   get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
+  get_theme_sys_color_func = (GetThemeSysColorFunc) GetProcAddress(uxtheme_dll, "GetThemeSysColor");
+  get_theme_sys_metric_func = (GetThemeSysSizeFunc) GetProcAddress(uxtheme_dll, "GetThemeSysSize");
 
   if (is_theme_active_func)
     {
@@ -183,6 +202,8 @@ xp_theme_exit (void)
   draw_theme_background_func = NULL;
   enable_theme_dialog_texture_func = NULL;
   get_theme_sys_font_func = NULL;
+  get_theme_sys_color_func = NULL;
+  get_theme_sys_metric_func = NULL;
 }
 
 static HTHEME
@@ -214,6 +235,11 @@ xp_theme_get_handle_by_element (XpThemeElement element)
       klazz = XP_THEME_CLASS_REBAR;
       break;
 
+       case XP_THEME_ELEMENT_STATUS_GRIPPER:
+       case XP_THEME_ELEMENT_STATUS_PANE:
+               klazz = XP_THEME_CLASS_STATUS;
+               break;
+
     case XP_THEME_ELEMENT_TOOLBAR:
       klazz = XP_THEME_CLASS_TOOLBAR;
       break;
@@ -223,6 +249,11 @@ xp_theme_get_handle_by_element (XpThemeElement element)
       klazz = XP_THEME_CLASS_GLOBALS;
       break;
 
+    case XP_THEME_ELEMENT_MENUITEM:
+    case XP_THEME_ELEMENT_MENU_SEPARATOR:
+      klazz = XP_THEME_CLASS_MENU;
+      break;
+
     case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
     case XP_THEME_ELEMENT_CHECKBOX:
     case XP_THEME_ELEMENT_BUTTON:
@@ -306,6 +337,11 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
       ret = CHEVS_NORMAL;
       break;
 
+       case XP_THEME_ELEMENT_STATUS_GRIPPER:
+       case XP_THEME_ELEMENT_STATUS_PANE:
+               ret = 1;
+               break;
+
     case XP_THEME_ELEMENT_CHEVRON:
       switch (state)
        {
@@ -585,6 +621,20 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
 
 #endif
 
+       case XP_THEME_ELEMENT_MENUITEM:
+       case XP_THEME_ELEMENT_MENU_SEPARATOR:
+               switch(state) {
+                       case GTK_STATE_SELECTED:
+                               ret = MS_SELECTED;
+                               break;
+                       case GTK_STATE_INSENSITIVE:
+                               ret = MS_DEMOTED;
+                               break;
+                       default:
+                               ret = MS_NORMAL;
+               }
+               break;
+
     default:
       switch(state)
         {
@@ -676,7 +726,7 @@ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
       FillRect (dc, &rect, (HBRUSH) (COLOR_3DFACE+1));
     }
 #endif
-  
+
   draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, pClip);
   gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);
 
@@ -697,7 +747,7 @@ xp_theme_is_drawable (XpThemeElement element)
         {
           xp_theme_reset ();
         }
-      
+
       if (active)
         {
           return (xp_theme_get_handle_by_element (element) != NULL);
@@ -708,11 +758,55 @@ xp_theme_is_drawable (XpThemeElement element)
 }
 
 gboolean
-xp_theme_get_system_font (int fontId, LOGFONT *lf)
+xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf)
 {
+  int themeFont;
+
   if (get_theme_sys_font_func != NULL)
     {
-      return ((*get_theme_sys_font_func)(NULL, fontId, lf) == S_OK);
+         HTHEME theme = xp_theme_get_handle_by_class(klazz);
+         if (!theme)
+               return FALSE;
+
+       switch (fontId){
+               case XP_THEME_FONT_CAPTION:
+                       themeFont = TMT_CAPTIONFONT; break;
+               case XP_THEME_FONT_MENU:
+                       themeFont = TMT_MENUFONT; break;
+               case XP_THEME_FONT_STATUS:
+                       themeFont = TMT_STATUSFONT; break;
+               case XP_THEME_FONT_MESSAGE:
+               default:
+                       themeFont = TMT_MSGBOXFONT; break;
+       }
+         /* if theme is NULL, it will just return the GetSystemFont() value */
+      return ((*get_theme_sys_font_func)(theme, themeFont, lf) == S_OK);
+    }
+  return FALSE;
+}
+
+gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor)
+{
+  if (get_theme_sys_color_func != NULL)
+    {
+          HTHEME theme = xp_theme_get_handle_by_class(klazz);
+
+          /* if theme is NULL, it will just return the GetSystemColor() value */
+          *pColor = (*get_theme_sys_color_func)(theme, colorId);
+          return TRUE;
+    }
+  return FALSE;
+}
+
+gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal)
+{
+  if (get_theme_sys_metric_func != NULL)
+    {
+          HTHEME theme = xp_theme_get_handle_by_class(klazz);
+
+          /* if theme is NULL, it will just return the GetSystemMetrics() value */
+          *pVal = (*get_theme_sys_metric_func)(theme, metricId);
+          return TRUE;
     }
   return FALSE;
 }
index cec3d308f24d2aec971acac1328d978ea2ef2727..593144398ffcf36fe8a516809c4d0458800630d4 100755 (executable)
@@ -39,6 +39,9 @@ typedef enum
   XP_THEME_CLASS_REBAR,\r
   XP_THEME_CLASS_TOOLBAR,\r
   XP_THEME_CLASS_GLOBALS,\r
+  XP_THEME_CLASS_MENU,\r
+  XP_THEME_CLASS_WINDOW,\r
+  XP_THEME_CLASS_STATUS,\r
   XP_THEME_CLASS__SIZEOF\r
 } XpThemeClass;\r
 \r
@@ -81,11 +84,23 @@ typedef enum
   XP_THEME_ELEMENT_GRIPPER_V,\r
   XP_THEME_ELEMENT_CHEVRON,\r
   XP_THEME_ELEMENT_TOOLBAR,\r
+  XP_THEME_ELEMENT_MENUITEM,\r
+  XP_THEME_ELEMENT_MENU_SEPARATOR,\r
+  XP_THEME_ELEMENT_STATUS_GRIPPER,\r
+  XP_THEME_ELEMENT_STATUS_PANE,\r
   XP_THEME_ELEMENT_HLINE,\r
   XP_THEME_ELEMENT_VLINE,\r
   XP_THEME_ELEMENT__SIZEOF\r
 } XpThemeElement;\r
 \r
+typedef enum\r
+{\r
+       XP_THEME_FONT_CAPTION,\r
+       XP_THEME_FONT_MENU,\r
+       XP_THEME_FONT_STATUS,\r
+       XP_THEME_FONT_MESSAGE\r
+} XpThemeFont;\r
+\r
 void xp_theme_init (void);\r
 void xp_theme_reset (void);\r
 void xp_theme_exit (void);\r
@@ -94,6 +109,8 @@ gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,
                         int height, GtkStateType state_type,\r
                         GdkRectangle *area);\r
 gboolean xp_theme_is_drawable (XpThemeElement element);\r
-gboolean xp_theme_get_system_font (int fontId, LOGFONT *lf);\r
+gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf);\r
+gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor);\r
+gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal);\r
 \r
 #endif /* XP_THEME_H */\r